package leetCode;

import common.GetListNode;

/**
 *2 两数之和
 *
 给你两个非空的链表，表示两个非负的整数。它们每位数字都是按照逆序的方式存储的，并且每个节点只能存储一位数字。
 请你将两个数相加，并以相同形式返回一个表示和的链表。
 你可以假设除了数字 0 之外，这两个数都不会以 0开头。

 示例 1：
 输入：l1 = [2,4,3], l2 = [5,6,4]
 输出：[7,0,8]
 解释：342 + 465 = 807.

 示例 2：
 输入：l1 = [0], l2 = [0]
 输出：[0]

 示例 3：
 输入：l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
 输出：[8,9,9,9,0,0,0,1]

 提示：
 每个链表中的节点数在范围 [1, 100] 内
 0 <= Node.val <= 9
 题目数据保证列表表示的数字不含前导零
 */
public class AddTwoNumber {
    public static void main(String[] args) {
        GetListNode.ListNode listNode = GetListNode.getListNode();
        addTwoNumbersMe(listNode,listNode);
    }

    static StringBuilder sb1 = new StringBuilder();
    static StringBuilder sb2 = new StringBuilder();

    //暴力解法，因为leetcode不能用BigIngeter和Bigdecimal，有个样例是超大的数字，Long顶不住，所以没过，思路没问题
    public static ListNode addTwoNumbersMe(GetListNode.ListNode l1, GetListNode.ListNode l2) {
        ListNode l3;
        while (l1 != null) {
            sb1.append(l1.val);
            l1 = l1.next;
        }
        while (l2 != null) {
            sb2.append(l2.val);
            l2 = l2.next;
        }
        sb1.reverse();
        sb2.reverse();
        Long i1 = Long.parseLong(sb1.toString());
        Long i2 = Long.parseLong(sb2.toString());
        Long i3 = i1+i2;
        StringBuilder sb3 = new StringBuilder(String.valueOf(i3));
        String s3 = sb3.reverse().toString();
        if (s3.length() == 0) {
            return new ListNode(0);
        }
        ListNode nodeStart = new ListNode(Integer.parseInt(String.valueOf(s3.charAt(0))));
        l3 = nodeStart;
        if (s3.length() > 1) {
            for (int i = 1;i<s3.length();i++) {
                l3.next = new ListNode(Integer.parseInt(String.valueOf(s3.charAt(i))));
                l3 = l3.next;
            }
        }
        l3 = nodeStart;
        return l3;
    }

    public static class ListNode {
        int val;
        ListNode next;
        ListNode() {}
        ListNode(int val) { this.val = val; }
        ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }
}
